<?php
require_once rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . '/Reader/reader.php';
/**
 * Клас помощник для чтения xls файлов.
 *
 */
class Arm_File_Excel_Reader
{
    /**
     * Путь к файлу.
     *
     * @string
     */
    private $_file;
    /**
     * Библиотека чтения xls файлов.
     *
     * @var Spreadsheet_Excel_Reader
     */
    private $_excelReader = null;
    
    public function __construct ($file, $charsetOut='UTF-8')
    {
        if (FALSE === is_file($file)) {
            throw new Arm_File_Excel_Exception(Arm_Translate::_('Не доступен файл: %s', $file));
        }
        $this->_file = $file;
        $this->_excelReader = new Spreadsheet_Excel_Reader();
        $this->_excelReader->setOutputEncoding($charsetOut);
        $this->_excelReader->setRowColOffset(0);
        $this->_excelReader->read($this->_file);
    }
    /**
     * Вернет обьект  Spreadsheet_Excel_Reader
     *
     * @return  Spreadsheet_Excel_Reader
     */
    public function getEcelReader ()
    {
        return $this->_excelReader;
    }
    /**
     * Вернет определенное количество строк с каждого листа книги, строки задаются в $limit
     * если лист не имеет данных - строк он не будет в результате.
     *
     * @param int $limit количество строк
     * @return array
     */
    public function getLimitStr ($limit)
    {
        $result = array();
        foreach ($this->getListsNotNullRows() as $k => $v) {
            
            $result[$k] = array_slice($this->_excelReader->sheets[$k]['cells'], 0, $limit);
        }
        return $result;
    }
    /**
     * Верент количество строк с каждого листа, в стартовой строки и до конца,
     * Масив будет состоять с ключа листа, и с его данных с определеной позиции.!!!
     *
     *
     * @param $params масив ключ порядковый номер листа, значения строка с которой получать данные.
     * @return array
     */
    public function getDataStartStrList ($params)
    {
        $result = array();
        foreach ($params as $list => $start) {
            if (false === array_key_exists($list, $this->_excelReader->sheets)) {
                throw new Arm_File_Excel_Exception(Arm_Translate::_('В книге не существует листа: %s', $list));
            }
            if ($this->_excelReader->sheets[$list]['numRows'] === 0) {
                throw new Arm_File_Excel_Exception(Arm_Translate::_('Вы указали лист в котором нету строк! порядковый номер листа: %s',$list++));
            }
            $start = (int) $start;
           /* if($start !==0) {
                $start--;
            }*/
            $slice = array_slice($this->_excelReader->sheets[$list]['cells'], $start);
            if ($slice === array()) {
                throw new Arm_File_Excel_Exception(Arm_Translate::_('Вы указали не существующею строку для старта в листе: %s, строка: %s',  $list, $start));
            }
            $result[$list] = $slice;
        }
        return $result;
    }
    /**
     * Вернет все данные в виде масива, Объденит все листы в один
     * массив, если лист но содержит данных, то данные
     * не будет вообще записанны. Вернет в виде одного массива!.
     *
     * @return array
     */
    public function getDataAll ()
    {
        $result = array();
        foreach ($this->getListsNotNullRows() as $k => $v) {
            $result = array_merge($result, $this->_excelReader->sheets[$k]['cells']);
        }
        return $result;
    }
    
    
    
    /**
     * Верент масив листов с книги, номер порядковый как ключ и значения названия листа.
     *
     * @return array
     */
    public function getLists ()
    {
        $result = array();
        foreach ($this->_excelReader->boundsheets as $k => $v) {
            $result[$k] = $v['name'];
        }
        return $result;
    }
    
    /**
     * Вернет листы которые имеют в себе ряды
     *
     * @return array
     */
    public function getListsNotNullRows()
    {
        $result = array();
        foreach ($this->getLists() as $k=>$v) {
            
        if ($this->_excelReader->sheets[$k]['numRows'] === 0) {
                continue;
            }
            $result[$k] = $v;
        }
        
        return $result;
    }
    
    /**
     * Вернет количество столбцов для каждого листа, по его id порядковому номеру.
     * Плюс не будет указывать те листы в которых нету данных.
     *
     * @return array
     */
    public function getCountColumsListNotNull ()
    {
        $result = array();
        foreach ($this->getListsNotNullRows() as $k => $v) {
          $result[$k] = $this->_excelReader->sheets[$k]['numCols'];
        }
        return $result;
    }
}
